﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//1. 结构体
//struct stu
//{
//	char name[20];
//	int age;
//	char id[20];
//	double weight;
//}s4; s5; s6; //s4,s5,s6是全局的结构体变量
//int main()
//{
//	struct stu s1 = { "zhangsan",21,"2213044134",108.5 };
//	struct stu s2 = { .age = 22,.weight = 80, .name = "zky",.id = 22130441 };
//
//	printf("名字:%s 年龄:%d\n", s2.name,s1.age);
//}
//2. 结构体的特殊声明
//匿名结构体(只用一次就不用了);
//struct
//{
//	char c;
//	int i;
//	double b;
//}s;
//int main()
//{
//	s.i = 100;
//	printf("%d\n", s.i);
//}
////3.结构的自引用
////数据结构--数据在内存中的存储结构
//struct Node
//{
//	int data;
//	struct Node* next;//同类型的结构体指针
//};
//int main()
//{
//	;
//}
//
//typedef struct
//{
//	int data;
//	struct Node* next;//这里不可以写成Node* next不能提前引用Node
//	//因为还没有创建成功
//}Node;//给这个结构体起的名字叫Node;

//二、结构体内存对齐
//1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
//2. 其他成员变量要对⻬到某个数字（对⻬数）的整数倍的地址处。
//对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。
//-VS 中默认的值为 8
//- Linux中 gcc 没有默认对⻬数，对⻬数就是成员⾃⾝的⼤⼩
//3. 结构体总⼤⼩为最⼤对⻬数（结构体中每个成员变量都有⼀个对⻬数，所有对⻬数中最⼤的）的
//整数倍。
//4. 如果嵌套了结构体的情况，嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处，结构
//体的整体⼤⼩就是所有最⼤对⻬数（含嵌套结构体中成员的对⻬数）的整数倍。
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//
//struct S2
//{
//	char c1;
//	char c2;
//	int i;
//};
//struct S3
//{
//	double i;
//	char c;
//	int b;
//};
//struct S4
//{
//	char c1;
//	struct S3 s3;
//	double a;
//};
//int main()
//{
//	printf("%zd\n", sizeof(struct S1 ));
//	printf("%zd\n", sizeof(struct S2));
//	printf("%zd\n", sizeof(struct S3));
//	printf("%zd\n", sizeof(struct S4));
//
//	return 0;
//}

//32位机器上,地址总线是32根,读,写数据的时候,一次就读/写32位(4个字节)
// 
// 
//建议1  2  4  8这种对齐数
//#pragma pack(2)//修改默认对齐数为1
//struct S
//{
//	char c;
//	int i;
//	char b;
//};
//#pragma pack()//回复默认对齐数为8
//int main()
//{
//	printf("%zd\n", sizeof(struct S));
//}

struct S
{
	int data[100];
	char num[20];
};
//void print(struct S ss)
//{
//	for (int i = 0; i < 5; i++)
//	{
//		printf("%d ", ss.data[i]);
//	}
//	printf("\n");
//	printf("%s\n", ss.num);
//}
void print(struct S* ps)
{
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", ps->data[i]);//结构体指针变量->成员名
	}
	printf("\n");
	printf("%s\n", ps->num);
}
int main()
{
	struct S s1 = { {1,2,3,4,5,6},"abcdef" };
	//print(s1);//传递的是结构体变量 ss还得再创建一个空间来存放s1的内容,空间时间都浪费
	print(&s1);//传递的是结构体变量的地址
	return 0;
}
//结论:结构体传参时,要传结构体的地址;
